#ifndef __HAL_I2C_H__
#define __HAL_I2C_H__

#include "gbl_types.h"
#include "os_api.h"
/*===========================================================================

                          Type definition.

===========================================================================*/
typedef enum
{
    STANDARD_MODE = 0,	/*100Kbps*/
    FAST_MODE = 1,		/*400Kbps*/
    HS_MODE = 2,		/*3.4 Mbps slave/3.3 Mbps master,standard mode when not doing a high speed transfer*/
    HS_MODE_FAST = 3,	/*3.4 Mbps slave/3.3 Mbps master,fast mode when not doing a high speed transfer*/
} I2C_MODE_E;


/*===========================================================================

                          INTERNAL FUNCTION DECLARATIONS

===========================================================================*/

/*****************************************************************
* Function: hal_I2cInit
*
* Description:
* 	该函数用于初始化 I2C 总线。
* 
* Parameters:
* 	i2c_no	  	[in] 	 I2C 通路索引号。
*               			0: i2c1 (SCL/SDA: GPIO_49/GPIO_50)
*               			1: i2c2 (SCL/SDA: GPIO_10/GPIO_11)
*               			2: i2c3 (SCL/SDA: GPIO_12/GPIO_13)
*               			3: i2c4 (SCL/SDA: GPIO_25/GPIO_26)
* 	fastMode	[in] 	 I2C 的工作模式。
* Return:
* 	0 初始化成功
*	-1 初始化失败
*
*****************************************************************/
int hal_I2cInit(UINT8 i2c_no, UINT8 fastMode);

/*****************************************************************
* Function: hal_I2cWrite
*
* Description:
* 	该函数用于向 I2C 总线中写入数据。
* 
* Parameters:
* 	i2c_no	  		[in] 	I2C 通路索引号。
* 	slaveaddress	[in] 	I2C 设备地址。
* 	addr			[in] 	I2C 寄存器地址。
* 	data	 		[in] 	写入的数据。
* 	datalen	  		[in] 	写入数据的长度。
* Return:
* 	0 写入成功
*	-1 写入失败
*
*****************************************************************/
int hal_I2cWrite(UINT8 i2c_no, UINT16 slaveaddress, UINT16 addr, UINT8 *data, UINT32 datalen);

/*****************************************************************
* Function: hal_I2cRead
*
* Description:
* 	该函数用于从 I2C 总线中读取数据。
* 
* Parameters:
* 	i2c_no	  		[in] 	I2C 通路索引号。
* 	slaveaddress	[in] 	I2C 设备地址。
* 	addr			[in] 	I2C 寄存器地址。
* 	data	 		[in] 	读取的数据。
* 	datalen	  		[in] 	读取数据的长度。
* Return:
* 	0 读取成功
*	-1 读取失败
*
*****************************************************************/
int hal_I2cRead(UINT8 i2c_no, UINT16 slaveaddress, UINT16 addr, UINT8 *data, UINT32 datalen);

/*****************************************************************
* Function: hal_I2cWriteEx
*
* Description:
* 	该函数用于向 I2C 总线中写入数据。
* 
* Parameters:
* 	i2c_no	  		[in] 	I2C 通路索引号。
* 	slaveaddress	[in] 	I2C 设备地址。
* 	addr			[in] 	I2C 寄存器地址。
* 	addrlen			[in] 	I2C 寄存器地址长度。
* 	data	 		[in] 	写入的数据。
* 	datalen	  		[in] 	写入数据的长度。
* Return:
* 	0 写入成功
*	-1 写入失败
*
*****************************************************************/
int hal_I2cWriteEx(UINT8 i2c_no, UINT16 slaveaddress, UINT8 *addr, UINT32 addrlen, UINT8 *data, UINT32 datalen);

/*****************************************************************
* Function: hal_I2cReadEx
*
* Description:
* 	该函数用于从 I2C 总线中读取数据。
* 
* Parameters:
* 	i2c_no	  		[in] 	I2C 通路索引号。
* 	slaveaddress	[in] 	I2C 设备地址。
* 	addr			[in] 	I2C 寄存器地址。
* 	addrlen			[in] 	I2C 寄存器地址长度。
* 	data	 		[in] 	读取的数据。
* 	datalen	  		[in] 	读取数据的长度。
* Return:
* 	0 读取成功
*	-1 读取失败
*
*****************************************************************/
int hal_I2cReadEx(UINT8 i2c_no, UINT16 slaveaddress, UINT8 *addr, UINT32 addrlen, UINT8 *data, UINT32 datalen);

#endif
